﻿using System;
using System.Collections.Generic;
using Business.Entity.Fiscal;
using Business.Entity.Fiscal.ClassesRelacionadas;
using Business.Enum;
using NHibernate.Criterion;

namespace Relatorios.Loaders.Fiscal
{
    public class NotaFiscalLoader
    {
        public static IList<NotaFiscalAoConsumidorItem> Carregar(ModeloNotaFiscal mod, String serie)
        {
            var l = NotaFiscalRepository.GetSession().CreateCriteria<NotaFiscal>().Add(
                Restrictions.Where<NotaFiscal>(fiscal => fiscal.Serie == serie))
                .AddOrder(Order.Asc("DataEmissao"))
                .AddOrder(Order.Asc("Numero"))
                .List<NotaFiscal>();
            return MontaLista(l);
        }
        public static IList<NotaFiscalAoConsumidorItem> Carregar(ModeloNotaFiscal mod, String serie, DateTime inicio,
            DateTime fim)
        {
            var l = NotaFiscalRepository.GetSession().CreateCriteria<NotaFiscal>().Add(
                Restrictions.Where<NotaFiscal>(fiscal => fiscal.Modelo == mod &&
                                                         fiscal.Serie == serie &&
                                                         (fiscal.DataEmissao >= inicio &&
                                                         fiscal.DataEmissao <= fim)))
                                                         .AddOrder(Order.Asc("DataEmissao"))
                                                         .AddOrder(Order.Asc("Numero"))
                                                         .List<NotaFiscal>();
            return MontaLista(l);
        }

        private static IList<NotaFiscalAoConsumidorItem> MontaLista(IList<NotaFiscal> l)
        {
            var ret = new List<NotaFiscalAoConsumidorItem>();
            foreach (var nota in l)
            {
                var item = new NotaFiscalAoConsumidorItem();
                item.Emissao = nota.DataEmissao;
                item.Modelo = nota.Modelo;
                item.Numero = nota.Numero;
                item.Serie = nota.Serie;
                foreach (var prod in nota.Produtos)
                {
                    GetProdutoByCFOP(prod, item.Valores);
                    item.TotalGeral += prod.ValorUnitario * prod.Quantidade;
                }
                ret.Add(item);
            }
            return ret;
        }

        private static NotaFiscalAoConsumidorValorCFOP GetProdutoByCFOP(ProdutoNotaFiscal prod, IList<NotaFiscalAoConsumidorValorCFOP> valores)
        {

            //foreach (var valor in valores)
            //{
            //    if (valor.CFOP.Cfop == prod.CFOP.Cfop)
            //    {
            //        valor.Valor = prod.ValorUnitario * prod.Quantidade;
            //        return valor;
            //    }
            //}
            //NotaFiscalAoConsumidorValorCFOP ret = null;
            //ret = new NotaFiscalAoConsumidorValorCFOP();
            //ret.CFOP = prod.CFOP;
            //ret.Valor = prod.ValorUnitario * prod.Quantidade;
            //valores.Add(ret);
            if (valores.Count == 0)
            {
                valores.Add(new NotaFiscalAoConsumidorValorCFOP());
            }
            valores[0].Valor += prod.ValorUnitario * prod.Quantidade;
            return valores[0];
        }
    }

    public class NotaFiscalAoConsumidorItem
    {
        public DateTime Emissao { get; set; }
        public int Numero { get; set; }
        public ModeloNotaFiscal Modelo { get; set; }
        public string Serie { get; set; }
        public decimal TotalGeral { get; set; }
        public IList<NotaFiscalAoConsumidorValorCFOP> Valores { get; set; }

        public NotaFiscalAoConsumidorItem()
        {
            Valores = new List<NotaFiscalAoConsumidorValorCFOP>();
        }
    }

    public class NotaFiscalAoConsumidorValorCFOP
    {
        public CFOP CFOP { get; set; }
        public decimal Valor { get; set; }
    }
}
